
package com.x52im.rbchat.logic.sns_group;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.widget.DataLoadingAsyncTask2;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.IMClientManager;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.AlarmsProvider;
import com.x52im.rbchat.cache.GroupsProvider;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rainbowchat.http.logic.dto.GroupEntity;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.alarm.AlarmType;
import com.x52im.rbchat.logic.chat_group.utils.GChatDataHelper;
import com.x52im.rbchat.logic.chat_group.utils.GMessageHelper;
import com.x52im.rbchat.logic.search.model.MsgSummaryContentDTO;
import com.x52im.rbchat.logic.sns_friend.ChatInfoActivity;
import com.x52im.rbchat.network.http.HttpRestHelper;
import com.x52im.rbchat.network.http.async.QueryFriendInfo;
import com.x52im.rbchat.utils.ActivityRequestCode;
import com.x52im.rbchat.utils.ActivityResultCode;
import com.x52im.rbchat.utils.IntentFactory;
import com.x52im.rbchat.utils.PreferencesToolkits;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;

import androidx.core.app.ActivityCompat;

/**
 * 群组聊天消息或的协议发送和解析实用类。
 *
 * @author Tony ma
 * @since 4.3
 */
public class GroupInfoActivity extends DataLoadableActivity {

    private static String TAG = GroupInfoActivity.class.getSimpleName();

    /** 操作常量定义之：修改群名（群主可用）*/
    private static final int IS_CHANGE_GROUP_NAME = 0;
    /** 操作常量定义之：修改群内昵称（普通群员可用） */
    private static final int IS_CHANGE_MY_NICKNAME_IN_GROUP = 1;
    /** 操作常量定义之：编辑公告（普通群员可用） */
    private static final int IS_CHANGE_GROUP_NOTICE = 2;
    /** 操作常量定义之：退出本群（普通群员可用） */
    private static final int OPR_QUIT_GROUP = 3;
    /** 操作常量定义之：解散本群（群主可用）*/
    private static final int OPR_DISMISS_GROUP = 4;

    private Button btnClickGroupName;
    private TextView viewGroupName;

    private Button btnClickQRCode;

    private Button btnClickOwner;
    private TextView viewOwnerName;

    private Button btnClickNickNameInGroup;
    private TextView viewNickNameInGroup;

    private Button btnClickMsgTone;
    private CheckBox msgToneChkBox;

    private Button btnClickAlwaysTop;
    private CheckBox alwaysTopChkBox;

    private Button btnClickShowNick;
    private CheckBox showNickChkBox;

    private ViewGroup layoutNotice;
    private TextView viewNotice;

    private Button btnClickMembers;
    private TextView viewMembers;

    private Button btnClickInviteToGroup;

    private ViewGroup layoutOwnerBtns;
    private ViewGroup layoutmemberBtns;
    /** 按钮：转让本群（群主可用）*/
    private Button btnTransferGroup;
    /** 按钮：解散本群（群主可用）*/
    private Button btnDismissGroup;
    /** 按钮：退出本群（普通群员可用）*/
    private Button btnExitGroup;

    /** 按钮：查找聊天记录 */
    private Button btnSearchHistory;
    /** 按钮：清空聊天记录 */
    private Button btnClearHistory;

    private GroupEntity groupInfoForInit = null;

    /**
     * 解析从Intent中传过来的可能的数据本方法中实现.
     * 例如从上一个activity中传过来的数据，本方法被 {@link #init(Bundle)}调用。
     */
    @Override
    protected void initDataFromIntent() {
        // 解析从intent中传过来的数据
        ArrayList intentDatas = IntentFactory.parseGroupInfoIntent(getIntent());
        groupInfoForInit = (GroupEntity)intentDatas.get(0);
    }

    /**
     * <p>
     * UI的初始化在此方法中实现.
     * 例如设置context对象以及给需要用的组件初始化（例如使用fingviewbyid方法获取所需的对象）等。
     * 本方法被 {@link #init(android.os.Bundle)}调用。
     */
    @Override
    protected void initViews(Bundle savedInstanceState) {
        // 设定自定义标题栏（设定此值即意味着开启自定义标题栏的使用，必须要在setContentView前设定）
        customeTitleBarResId = R.id.groupchat_groupinfo_title_bar;
        // 养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
        setContentView(R.layout.groupchat_groupinfo);

        // 初始化各种组件
        btnClickGroupName = findViewById(R.id.groupchat_groupinfo_groupNameBtn);
        viewGroupName = findViewById(R.id.groupchat_groupinfo_groupName_text);

        btnClickQRCode = findViewById(R.id.groupchat_groupinfo_qrcodeBtn);

        btnClickOwner = findViewById(R.id.groupchat_groupinfo_ownerBtn);
        viewOwnerName = findViewById(R.id.groupchat_groupinfo_ownerName_text);

        btnClickNickNameInGroup = findViewById(R.id.groupchat_groupinfo_nickNameInGroupBtn);
        viewNickNameInGroup = findViewById(R.id.groupchat_groupinfo_nickNameInGroup_text);

        btnClickMsgTone = findViewById(R.id.groupchat_groupinfo_msgNoPromtBtn);
        msgToneChkBox = findViewById(R.id.groupchat_groupinfo_msgNoPromt_switch);

        btnClickAlwaysTop = findViewById(R.id.groupchat_groupinfo_topBtn);
        alwaysTopChkBox = findViewById(R.id.groupchat_groupinfo_top_switch);

        btnClickShowNick = findViewById(R.id.groupchat_groupinfo_showNickBtn);
        showNickChkBox = findViewById(R.id.groupchat_groupinfo_showNick_switch);

        layoutNotice = findViewById(R.id.groupchat_groupinfo_notice_LL);
        viewNotice = findViewById(R.id.groupchat_groupinfo_noticeView);

        btnClickMembers = findViewById(R.id.groupchat_groupinfo_membersBtn);
        viewMembers = findViewById(R.id.groupchat_groupinfo_members_count);

        btnClickInviteToGroup = findViewById(R.id.groupchat_groupinfo_inviteBtn);

        layoutOwnerBtns = findViewById(R.id.groupchat_groupinfo_ownerBtns_ll);
        layoutmemberBtns = findViewById(R.id.groupchat_groupinfo_memberBtns_ll);
        btnTransferGroup = findViewById(R.id.groupchat_groupinfo_invite_transferBtn);
        btnDismissGroup = findViewById(R.id.groupchat_groupinfo_invite_dismissBtn);
        btnExitGroup = findViewById(R.id.groupchat_groupinfo_invite_exitGroupBtn);

        btnSearchHistory = findViewById(R.id.groupchat_groupinfo_searhHistoryBtn);
        btnClearHistory = findViewById(R.id.groupchat_groupinfo_clearhHistoryBtn);

        refreshButtonsVisible();

        // 设置标题
        this.setTitle("群聊信息");
        //
        this.setLoadDataOnCreate(false);

        // 根据Intent中传过来的U友信息数据，刷新UI界面显示
        this.refreshToView(groupInfoForInit);
    }

    private void refreshButtonsVisible() {
        // 本地用户是该群群主
        if(localUserIsGroupOwner()) {
            layoutOwnerBtns.setVisibility(View.VISIBLE);
            layoutmemberBtns.setVisibility(View.GONE);
        } else {
            layoutOwnerBtns.setVisibility(View.GONE);
            layoutmemberBtns.setVisibility(View.VISIBLE);
        }
    }

    /**
     * 本地用户是否是该群群主。
     *
     * @return true表示是，否则不是
     */
    private boolean localUserIsGroupOwner() {
        return GroupsProvider.isGroupOwner(groupInfoForInit.getG_owner_user_uid());
    }

    /**
     * 清除聊天记录。
     */
    private void doClearHistory(){
        new AlertDialog.Builder(self())
                .setTitle($$(R.string.general_are_u_sure))
                .setMessage("确定清空本群的聊天记录吗？")
                .setPositiveButton($$(R.string.general_clear), (dialog, which) -> ChatInfoActivity.clearHistory(self(), AlarmType.groupChat, groupInfoForInit.getG_id()))
                .setNegativeButton($$(R.string.general_cancel), null)
                .show();
    }

    /**
     * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
     */
    @Override
    protected void initListeners() {
        // 查看群主个人信息
        btnClickOwner.setOnClickListener(v -> QueryFriendInfo.gotoWatchUserInfo(self(), groupInfoForInit.getG_owner_user_uid(), null));
        // "群聊二维码"按钮事件处理
        btnClickQRCode.setOnClickListener(v -> startActivity(IntentFactory.createQRCodeGenerateGroupIntent(self(), groupInfoForInit.getG_id())));
        // "消息免打扰"按钮事件处理
        btnClickMsgTone.setOnClickListener(v -> msgToneChkBox.setChecked(!msgToneChkBox.isChecked()));
        // "消息免打扰"单选框事件处理
        msgToneChkBox.setOnCheckedChangeListener((buttonView, isChecked) -> PreferencesToolkits.setChatMsgToneOpen(GroupInfoActivity.this, !isChecked, groupInfoForInit.getG_id()));
        // "置顶聊天"按钮事件处理
        btnClickAlwaysTop.setOnClickListener(v -> alwaysTopChkBox.setChecked(!alwaysTopChkBox.isChecked()));
        // "置顶聊天"单选框事件处理
        alwaysTopChkBox.setOnCheckedChangeListener((buttonView, isChecked) -> AlarmsProvider.doSetAlwaysTopNow(self(), isChecked, AlarmType.groupChat, groupInfoForInit.getG_id(), groupInfoForInit.getG_name()));
        // "显示群成员昵称"按钮事件处理
        btnClickShowNick.setOnClickListener(v -> showNickChkBox.setChecked(!showNickChkBox.isChecked()));
        // "显示群成员昵称"单选框事件处理
        showNickChkBox.setOnCheckedChangeListener((buttonView, isChecked) -> PreferencesToolkits.setGroupShowNick(GroupInfoActivity.this, isChecked, groupInfoForInit.getG_id()));
        // 修改群名称事件处理
        btnClickGroupName.setOnClickListener(v -> doChangeGroupName());
        // 修改"我"在群内的昵称事件处理
        btnClickNickNameInGroup.setOnClickListener(v -> doChangeMyNickname());
        // 修改群公告事件处理
        layoutNotice.setOnClickListener(v -> doEditGroupNotice());
        // 查看群成员(普通群员用)/管理群成员(群主用)
        btnClickMembers.setOnClickListener(v -> ActivityCompat.startActivityForResult(self(), IntentFactory.createGroupMemberActivityIntent(self(), GroupMemberActivity.USED_FOR_VIEW_OR_MANAGER_MEMBERS, groupInfoForInit.getG_id(), GroupsProvider.isGroupOwner(groupInfoForInit.getG_owner_user_uid()), null), ActivityRequestCode.REQUEST_CODE_FOR_VIEW_MEMBERS, null));
        // 邀请入群
        btnClickInviteToGroup.setOnClickListener(v -> ActivityCompat.startActivityForResult(self(), IntentFactory.createGroupMemberActivityIntent(self(), GroupMemberActivity.USED_FOR_INVITE_MEMBERS, groupInfoForInit.getG_id(), GroupsProvider.isGroupOwner(groupInfoForInit.getG_owner_user_uid()), null), ActivityRequestCode.REQUEST_CODE_FOR_INVITE_MEMBERS, null));
        // 退出本群（群员可操作）
        btnExitGroup.setOnClickListener(v -> doExitGroup());
        // 解散本群（群主可用）
        btnDismissGroup.setOnClickListener(v -> doDismissGroup());
        // 转让群
        btnTransferGroup.setOnClickListener(v -> ActivityCompat.startActivityForResult(self(), IntentFactory.createGroupMemberActivityIntent(self(), GroupMemberActivity.USED_FOR_TRANSFER, groupInfoForInit.getG_id(), GroupsProvider.isGroupOwner(groupInfoForInit.getG_owner_user_uid()), null), ActivityRequestCode.REQUEST_CODE_FOR_TRANSFER, null));
        // 点击清除聊天记录的事件处理
        btnClearHistory.setOnClickListener(v -> doClearHistory());
        // 查找聊天记录按钮的事件处理
        btnSearchHistory.setOnClickListener(v -> ChatInfoActivity.searhHistory(self(), MsgSummaryContentDTO.SEARCH_RESULT_CHAT_TYPE_SGROUP, groupInfoForInit.getG_id()));
    }

    /**
     * 从服务端查询数据并返回.
     * 本类中无需单独查询数据（直接通过Intent传进来的）。
     *
     * @param params loadData中传进来的参数，本类中该参数没有被用到
     */
    @Override
    protected DataFromServer queryData(String... params) {
        return null;
    }

    //将已构造完成的完整的明细数据放入列表中显示出来
    @Override
    protected void refreshToView(Object dateToView) {
        if (dateToView != null && dateToView instanceof GroupEntity) {
            GroupEntity groupInfo = (GroupEntity) dateToView;

            this.viewGroupName.setText(groupInfo.getG_name());
            this.viewOwnerName.setText(groupInfo.getG_owner_name());
            this.viewNickNameInGroup.setText(GroupsProvider.getMyNickNameInGroup(this, groupInfo.getNickname_ingroup()));

            // 初始化"消息免打扰"checkbox
            this.msgToneChkBox.setChecked(!PreferencesToolkits.isChatMsgToneOpen(this, groupInfo.getG_id()));
            // 初始化"置顶聊天"checkbox
            this.alwaysTopChkBox.setChecked(imc().getAlarmsProvider().isAlwaysTop(AlarmType.groupChat, groupInfo.getG_id()));
            // 初始化"显示群成员昵称"checkbox
            this.showNickChkBox.setChecked(PreferencesToolkits.isGroupShowNick(this, groupInfo.getG_id()));

            // 显示公告
            boolean noticeIsEmpty = CommonUtils.isStringEmpty(groupInfo.getG_notice(), true);
            this.viewNotice.setText(noticeIsEmpty?"还没有设置公告，群主可点击进行设置！":groupInfo.getG_notice());

            this.viewMembers.setText(groupInfo.getG_member_count()+"人");

            // 群主和普通群员，看到的标签文字是不一样的
            this.btnClickMembers.setText(localUserIsGroupOwner()?"管理群员":"查看群员");
        } else {
            new AlertDialog.Builder(this)
                    .setTitle($$(R.string.general_error))
                    .setMessage($$(R.string.general_invalid_data))
                    .setPositiveButton($$(R.string.general_ok), null)
                    .show();
            finish();
            return;
        }
    }

    private void refreshDatas() {
        this.refreshButtonsVisible();
        this.refreshToView(this.groupInfoForInit);
    }

    /**
     * 处理下一级Activity的结果回调通知.
     */
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            // 这是进入"群成员管理"、"群成员邀请"界面的请求码（到此，意味着从群管理界面返回了）
            case ActivityRequestCode.REQUEST_CODE_FOR_VIEW_MEMBERS:
            case ActivityRequestCode.REQUEST_CODE_FOR_INVITE_MEMBERS: {
                // 将最新群成员数量刷新到界面上及时显示（因为在群成员管理界面里删除了成员）
                if (resultCode == Activity.RESULT_OK) {
                    String currentGroupMemberCount = data.getStringExtra("__currentGroupMemberCount__");
                    groupInfoForInit.setG_member_count(currentGroupMemberCount);
                    // 刷新UI显示
                    refreshDatas();
                }
                break;
            }
            // 从转让群主选择界面回来（刷新UI显示，因为已经不是群主了哦）
            case ActivityRequestCode.REQUEST_CODE_FOR_TRANSFER: {
                // 将群信息刷新到界面上及时显示（因为在转让界面里设置完成最新的群主信息）
                if (resultCode == Activity.RESULT_OK) {
                    GroupEntity updatedGe = (GroupEntity) data.getSerializableExtra("__updatedGroupInfo__");
                    if (updatedGe != null) {
                        this.groupInfoForInit = updatedGe;
                        // 刷新UI显示
                        refreshDatas();
                    }
                }
                break;
            }
            default:
                // do nothing
                Log.d(TAG, "!!! onActivityResult-> requestCode=" + requestCode);
                break;
        }
    }

    /**
     * 修改群名称。
     */
    private void doChangeGroupName(){
        if(!GroupsProvider.isGroupOwner(groupInfoForInit.getG_owner_user_uid())) {
            WidgetUtils.showToast(GroupInfoActivity.this, "只有群主可以修改群名称!", WidgetUtils.ToastType.WARN);
            return;
        }

        // 编辑界面的UI初始化
        LayoutInflater inflater = getLayoutInflater();
        final View layout = inflater.inflate(R.layout.groupchat_groupinfo_edit_gname, findViewById(R.id.groupchat_groupinfo_edit_gname_LL));
        final EditText nicknameView = layout.findViewById(R.id.groupchat_groupinfo_edit_gnameView);

        // 数据初始化
        nicknameView.setText(groupInfoForInit.getG_name());

        // 在AlertView中显示编辑界面
        new AlertDialog.Builder(GroupInfoActivity.this)
                .setTitle("群聊名称")
                .setView(layout)
                .setPositiveButton($$(R.string.general_save), (dialog, which) -> {
                    if(!CommonUtils.isStringEmpty(nicknameView.getText().toString())) {
                        // 修改后的内容跟修改前的不相等才需要提交哦
                        if(!groupInfoForInit.getG_name().equals(nicknameView.getText().toString().trim())) {
                            new BaseDataEditAsyncTask().execute(IS_CHANGE_GROUP_NAME
                                    , nicknameView.getText().toString()
                                    , groupInfoForInit.getG_id()
                                    , lu().getUser_uid()
                                    , GroupsProvider.getMyNickNameInGroupEx(GroupInfoActivity.this, groupInfoForInit.getG_id())//localUserInfo.getNickname()
                            );
                        }
                    }
                    else {
                        Toast.makeText(GroupInfoActivity.this, "群名称不能为空!", Toast.LENGTH_LONG).show();
                    }
                })
                .setNegativeButton($$(R.string.general_cancel), null)
                .show();
    }

    /**
     * 修改"我"在群内的昵称。
     */
    private void doChangeMyNickname(){
        // 编辑界面的UI初始化
        LayoutInflater inflater = getLayoutInflater();
        final View layout = inflater.inflate(R.layout.groupchat_groupinfo_edit_nickname_in_group, findViewById(R.id.groupchat_groupinfo_edit_nickname_in_group_LL));
        final EditText nicknameView = layout.findViewById(R.id.groupchat_groupinfo_edit_nickname_in_groupView);

        // 数据初始化
        nicknameView.setText(groupInfoForInit.getNickname_ingroup());

        // 在AlertView中显示编辑界面
        new AlertDialog.Builder(GroupInfoActivity.this)
                .setTitle("\"我\"的群昵称")
                .setView(layout)
                .setPositiveButton($$(R.string.general_save), (dialog, which) -> {
                    RosterElementEntity localUserInfo1 = imc().getLocalUserInfo();
                    if(localUserInfo1 != null) {
                        // 修改后的内容跟修改前的不相等才需要提交哦
                        if (groupInfoForInit.getNickname_ingroup() != null
                                && !groupInfoForInit.getNickname_ingroup().equals(nicknameView.getText().toString().trim())) {
                            new BaseDataEditAsyncTask().execute(IS_CHANGE_MY_NICKNAME_IN_GROUP
                                    , nicknameView.getText().toString(), groupInfoForInit.getG_id(), localUserInfo1.getUser_uid());
                        }
                    }
                })
                .setNegativeButton($$(R.string.general_cancel), null)
                .show();
    }

    /**
     * 修改群公告。
     */
    private void doEditGroupNotice(){
        // 如果是普通群员且公告为空，则直接提示并不需要打开这个界面
        if(!GroupsProvider.isGroupOwner(groupInfoForInit.getG_owner_user_uid()) && CommonUtils.isStringEmpty(groupInfoForInit.getG_notice())) {
            WidgetUtils.showToast(GroupInfoActivity.this, "只有群主可以编辑群公告!", WidgetUtils.ToastType.WARN);
            return;
        }

        // 编辑界面的UI初始化
        final View layout = getLayoutInflater().inflate(R.layout.groupchat_groupinfo_edit_notice, findViewById(R.id.groupchat_groupinfo_edit_notice_LL));

        ViewGroup updateUserInfoLayout = layout.findViewById(R.id.groupchat_groupinfo_edit_notice_updateUserInfo_LL);
        ImageView updateUserAvatarView = layout.findViewById(R.id.groupchat_groupinfo_edit_notice_lastEditAvatarView);
        TextView updateUserNickView = layout.findViewById(R.id.groupchat_groupinfo_edit_notice_lastEditNameView);
        TextView updateTimeView = layout.findViewById(R.id.groupchat_groupinfo_edit_notice_lastEditTimeView);

        final EditText noticeEdit = layout.findViewById(R.id.groupchat_groupinfo_edit_noticeView);
        boolean isGroupOwner = GroupsProvider.isGroupOwner(groupInfoForInit.getG_owner_user_uid());

        // 公告修改人信息是空的，就不显示修改人信息的UI界面了
        if(CommonUtils.isStringEmpty(groupInfoForInit.getG_notice_updateuid()))
            updateUserInfoLayout.setVisibility(View.GONE);
            // 否则显示公告修改人的信息
        else {
            // 尝试读取好友信息（如果对方是的话）
            RosterElementEntity friendInfo = imc().getFriendsListProvider().getFriendInfoByUid2(groupInfoForInit.getG_notice_updateuid());
            // 显示用户头像
            ImageCacheLoader.loadAvatarImgWithGlide(self(), groupInfoForInit.getG_notice_updateuid(), friendInfo == null?null:friendInfo.getUserAvatarFileName()
                    , updateUserAvatarView, 25, R.drawable.default_avatar_yuan_50_3x, false, false);

            updateUserNickView.setText(groupInfoForInit.getG_notice_updatenick());
            updateTimeView.setText(groupInfoForInit.getG_notice_updatetime());
        }

        // 只有群主才可以编辑，否则只能查看
        noticeEdit.setEnabled(isGroupOwner);
        // 数据初始化
        noticeEdit.setText(groupInfoForInit.getG_notice());

        if(isGroupOwner) {
            // 在AlertView中显示编辑界面
            new AlertDialog.Builder(self())
                    .setTitle("群公告")
                    .setView(layout)
                    .setPositiveButton($$(R.string.general_save), (dialog, which) -> {
                        if (lu() != null) {
                            // 修改后的内容跟修改前的不相等才需要提交哦
                            if (groupInfoForInit.getG_notice() != null
                                    && !groupInfoForInit.getG_notice().equals(noticeEdit.getText().toString().trim())) {
                                new BaseDataEditAsyncTask().execute(IS_CHANGE_GROUP_NOTICE, noticeEdit.getText().toString(), lu().getUser_uid(), groupInfoForInit.getG_id());
                            }
                        }
                    })
                    .setNegativeButton($$(R.string.general_cancel), null)
                    .show();
        } else {
            // 在AlertView中显示界面
            new AlertDialog.Builder(self())
                    .setTitle("群公告")
                    .setView(layout)
                    .setPositiveButton(null, null)
                    .setNegativeButton($$(R.string.general_cancel), null)
                    .show();
        }
    }

    /**
     * 退出本群（群员可操作）。
     */
    private void doExitGroup(){
        new AlertDialog.Builder(self())
                .setTitle($$(R.string.general_prompt))
                .setMessage("一旦退群，与此群有关的聊天记录都会被删除，确认退群吗？")
                .setPositiveButton($$(R.string.general_ok), (dialog, which) -> {
                    if(!localUserIsGroupOwner())
                        new BaseDataEditAsyncTask().execute(OPR_QUIT_GROUP);
                    else
                        WidgetUtils.showToast(self(), "您是本群群主，请使用\"解散本群\"!", WidgetUtils.ToastType.WARN);
                })
                .setNegativeButton($$(R.string.general_cancel), null)
                .show();
    }

    /**
     * 解散本群（群主可用）.
     */
    private void doDismissGroup(){
        if(!localUserIsGroupOwner()) {
            WidgetUtils.showToast(self(), "只有群主才能解散群!", WidgetUtils.ToastType.WARN);
            return;
        }

        if(lu() != null) {
            new AlertDialog.Builder(self())
                    .setTitle($$(R.string.general_prompt))
                    .setMessage("一旦解散群，所有与此群有关的记录都会被删除，确认解散吗？")
                    .setPositiveButton($$(R.string.general_ok), (dialog, which) -> new BaseDataEditAsyncTask().execute(OPR_DISMISS_GROUP
                            // 只有群主有解散权限，所以能发起此操作的用地用户就是群主（而且万一本地信息已过时，则此用户id提交到服务
                            // 端后服务端会作检查，这样更保险，所以这比直接用groupInfoForInit.getG_owner_user_uid()更保险！）
                            , lu().getUser_uid()
                            , GroupsProvider.getMyNickNameInGroup(self(), groupInfoForInit.getNickname_ingroup())
                            , groupInfoForInit.getG_id()
                    ))
                    .setNegativeButton($$(R.string.general_cancel), null)
                    .show();
        }
    }

    /**
     * 提交修改群名、群公告、群内昵称数据请求和处理的异步执行线程实现类.
     */
    protected class BaseDataEditAsyncTask extends DataLoadingAsyncTask2<Object, Integer, DataFromServer> {
        private int sysActionConst = 0;
        private Object[] params = null;
        private RosterElementEntity localUser = null;

        public BaseDataEditAsyncTask() {
            super(GroupInfoActivity.this, $$(R.string.general_submitting));
            localUser = imc().getLocalUserInfo();
        }

        /**
         * 在后台执行信息的提交和处于结果的读取 .
         *
         * @param params 外界传进来的参数
         * @return 查询结果，将传递给onPostExecute(..)方法
         */
        @Override
        protected DataFromServer doInBackground(Object... params) {
            this.params = params;
            this.sysActionConst = (Integer)params[0];

            if(sysActionConst == IS_CHANGE_GROUP_NAME) {
                return HttpRestHelper.submitGroupNameModifiyToServer((String)params[1], (String)params[2], (String)params[3], (String)params[4]);
            }
            else if(sysActionConst == IS_CHANGE_MY_NICKNAME_IN_GROUP) {
                return HttpRestHelper.submitGroupNickNameModifiyToServer((String)params[1], (String)params[2], (String)params[3]);
            }
            else if(sysActionConst == IS_CHANGE_GROUP_NOTICE) {
                return HttpRestHelper.submitGroupNoticeModifiyToServer((String)params[1], (String)params[2], (String)params[3]);
            }
            else if(sysActionConst == OPR_QUIT_GROUP) {
                // 只有普通群员才退群（群主是解散群）
                if(!localUserIsGroupOwner() && localUser != null) {
                    // 要提交的数据参见接口文档（退群接口重用的就是删除群成员接口）
                    ArrayList<ArrayList> d = new ArrayList<>();
                    ArrayList row = new ArrayList();
                    row.add(groupInfoForInit.getG_id());
                    row.add(localUser.getUser_uid());
                    row.add(GroupsProvider.getMyNickNameInGroupEx(context, groupInfoForInit.getG_id()));//localUser.getNickname());
                    d.add(row);

                    return HttpRestHelper.submitDeleteOrQuitGroupToServer(
                            localUser.getUser_uid()
                            , GroupsProvider.getMyNickNameInGroupEx(context, groupInfoForInit.getG_id())//localUser.getNickname()
                            , groupInfoForInit.getG_id()
                            , d);
                }
            }
            else if(sysActionConst == OPR_DISMISS_GROUP) {
                // 只有群主才能解散群
                if(localUserIsGroupOwner()) {
                    return HttpRestHelper.submitDismissGroupToServer((String)params[1], (String)params[2], (String)params[3]);
                }
            }
//          else
            {
                DataFromServer dfs = new DataFromServer();
                dfs.setSuccess(false);
                return dfs;
            }
        }

        /**
         * 处理服务端返回的登陆结果信息（具体返回结果，请以 doInBackground 中调用的http接口为准）.
         */
        protected void onPostExecuteImpl(Object result) {
            String res;
            boolean updateSucess = "1".equals((String)result);

            if(updateSucess)
                res = $$(R.string.user_info_update_success);
            else
                res = $$(R.string.general_faild);

            // 只在服务端已更新成功时才刷新客户端数据显示
            if(updateSucess) {
                if (sysActionConst == IS_CHANGE_GROUP_NAME) {
                    // 更新全局缓存
                    groupInfoForInit.setG_name((String) params[1]);
                    // 本地往聊天界面中显示一条群名被"我"修改的系统通知
                    GChatDataHelper.addSystemInfo_groupNameChangedForLocalUser(GroupInfoActivity.this, groupInfoForInit.getG_id(), groupInfoForInit.getG_name());
                } else if (sysActionConst == IS_CHANGE_MY_NICKNAME_IN_GROUP) {
                    // 更新全局缓存
                    groupInfoForInit.setNickname_ingroup((String) params[1]);
                } else if(sysActionConst == IS_CHANGE_GROUP_NOTICE) {
                    //** 更新全局缓存
                    groupInfoForInit.setG_notice((String) params[1]);
                    // 以下3个字段其实应该是从服务端取过来，但实际上本次就是群主本人修改的，所以完全没必要再浪费服务器的查询，直接本地更新即可（反正只是用于UI显示而已）
                    groupInfoForInit.setG_notice_updateuid(localUser.getUser_uid());
                    groupInfoForInit.setG_notice_updatenick(GroupsProvider.getMyNickNameInGroupEx(context, groupInfoForInit.getG_id()));//localUser.getNickname());
                    groupInfoForInit.setG_notice_updatetime(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()));
                } else if(sysActionConst == OPR_DISMISS_GROUP || sysActionConst == OPR_QUIT_GROUP) {
                    IMClientManager immgr = imc();
                    // 从首页"消息"列表中删除此群
                    immgr.getAlarmsProvider().removeGroupChatMessageAlarm(groupInfoForInit.getG_id());
                    // 再从本地缓存的群列表中删除此群信息
                    immgr.getGroupsProvider().remove(immgr.getGroupsProvider().getIndex(groupInfoForInit.getG_id()), true);
                }

                // 将数据改动更新到群列表数据模型（即全局缓存）
                // 注意：因groupInfoForInit是通过Intent传进来的对象，是由Andriod自动使用序列化、反序列化得到的新
                //      对象，并非原对象哦（也即本对象是原对象的深拷贝），所以此处的修改需要手动更新过去才能更新原对象哦
                imc().getGroupsProvider().updateGroup(groupInfoForInit);

                // 刷新界面数据显示
                refreshDatas();

                if(sysActionConst == OPR_DISMISS_GROUP) {
                    res = "此群已被您成功解散！";
                    //** 设置回调：通知前一个activity，作好群解散后的响应逻辑
                    setResult(ActivityResultCode.RESULT_CODE_FOR_DISMISS_GROUP);
                    activityFinish();
                }
                else if(sysActionConst == OPR_QUIT_GROUP) {
                    res = "您已退出此群！";
                    //** 设置回调：通知前一个activity，作好退群后的响应逻辑
                    setResult(ActivityResultCode.RESULT_CODE_FOR_QUIT_GROUP);
                    activityFinish();
                }
                else if(sysActionConst == IS_CHANGE_GROUP_NOTICE) {
                    final String fullNoticeContent = (String)params[1];
                    // 如果本次修改完成的公告内容不为空，则修改完成后关闭本界面，并自动向所有群员发出新公告，同时回到聊天界面
                    if(!CommonUtils.isStringEmpty(fullNoticeContent, true)) {
                        res = null;

                        new AlertDialog.Builder(GroupInfoActivity.this)
                                .setTitle("通知确认")
                                .setMessage("该公告已修改成功，是否通知全部群成员？")
                                .setPositiveButton("通知", (dialog, which) -> {
                                    String noticeUpdateMsg = "@所有人\n" + "【群公告】" + CommonUtils.truncString(fullNoticeContent, 450);
                                    // 向所有群员发出公告(以下代码用于在公告编辑完成后，向所有成员发出公告通知（像微信一样）)
                                    GMessageHelper.sendPlainTextMessageAsync(GroupInfoActivity.this, groupInfoForInit.getG_id()
                                            , noticeUpdateMsg
                                            , Collections.singletonList("0") // RainbowChat中约定：被"@"的uid为"0"时，表示"@所有人"
                                            , null
                                            , (observable, data) -> activityFinish());
                                })
                                .setNegativeButton($$(R.string.general_no), null)
                                .show();
                    }
                    // 本次公告修改完成的公告内容为空的话，则修改完成继续停在本界面，不需要发出新公告也不需要关闭本界面
                    else {
//                        activityFinish();
                    }
                }
            }
            // 服务端返回失败结果
            else {
                if (sysActionConst == IS_CHANGE_GROUP_NOTICE) {
                    if ("2".equals((String) result))
                        res = "您已不是群主，本次修改失败！";
                } else if(sysActionConst == OPR_DISMISS_GROUP) {
                    if ("2".equals((String) result))
                        res = "您已不是群主，本次解散群失败！";
                }
            }

            if(res != null) {
                WidgetUtils.showToast(GroupInfoActivity.this, res, updateSucess?WidgetUtils.ToastType.OK:WidgetUtils.ToastType.WARN);
            }
        }

        private void activityFinish() {
            GroupInfoActivity.this.finish();
        }
    }
}
